home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / misc / WHDLoad_dev.lha / WHDLoad / Src / sources / whdload / jotd / lowlevel.s < prev    next >
Encoding:
Text File  |  2003-03-31  |  14.5 KB  |  652 lines

  1. * $Id: lowlevel.s 1.2 2003/02/19 07:43:29 wepl Exp $
  2.  
  3. ; most of this stuff was ripped from the real lowlevel library
  4.  
  5. TEST_JOY_BUTTON:MACRO
  6.     bclr    #JPB_BUTTON_\1,D0    ; button released
  7.     move.l    (A0)+,D1
  8.     tst.w    D1
  9.     beq.b    .rts_\1
  10.     bset    #JPB_BUTTON_\1,D0    ; button pressed
  11. .rts_\1
  12.     ENDM
  13.  
  14. **************************************************************************
  15. *   LOWLEVEL-LIBRARY                                                    *
  16. **************************************************************************
  17. **************************************************************************
  18. *   INITIALIZATION                                                       *
  19. **************************************************************************
  20.  
  21. LOWLINIT    move.l    _lowlbase(pc),d0
  22.         beq    .init
  23.         rts
  24.  
  25. .init        move.l    #162,d0        ; reserved function
  26.         move.l    #250,d1
  27.         lea    _lowlname(pc),a0
  28.         bsr    _InitLibrary
  29.         lea    _lowlbase(pc),a0
  30.         move.l    d0,(a0)
  31.         move.l    d0,a0
  32.         
  33.         patch    _LVOReadJoyPort(a0),_ReadJoyPort
  34.         patch    _LVOSetJoyPortAttrsA(a0),SETJOYPORTATTRS
  35.         patch    _LVOAddVBlankInt(a0),ADDVBLANKINT
  36.         patch    _LVOAddKBInt(a0),ADDKBINT
  37.         patch    _LVOAddTimerInt(a0),ADDTIMERINT
  38.         patch    _LVORemTimerInt(a0),REMTIMERINT
  39.         patch    _LVOStartTimerInt(a0),STARTTIMERINT
  40.         patch    _LVOStopTimerInt(a0),STOPTIMERINT
  41.         patch    _LVORemVBlankInt(a0),MYRTS
  42.         patch    _LVORemKBInt(a0),MYRTS
  43.         patch    _LVOQueryKeys(a0),QueryKeys
  44.         patch    _LVOSystemControlA(a0),MYRTZ
  45.         patch    _LVOGetLanguageSelection(a0),GETLANGSEL
  46.         patch    _LVOGetKey(a0),GETKEY
  47.         patch    _LVOElapsedTime(a0),ELAPSEDTIME
  48.  
  49.         ; cache flush (to be able to use function table at once)
  50.  
  51.         bsr    ForeignCacheFlush
  52.  
  53.         ; init timers and stuff...
  54.  
  55.         movem.l    D0-A6,-(A7)
  56.         move.l    D0,A5
  57.         CLR.L    242(A5)    ; i don't remember why I did that
  58.         move.l    #$ad303,44(A5)    ; EClock rate for timer
  59.  
  60.         lea.l   JOYPAD1KEYS(PC),a0 ;copy joypad keys to
  61.         lea.l   OSM_JOYPAD1KEYS(PC),a1 ;location in lowlevel.lib
  62.         moveq.l #6*2-1,d0
  63.         tst.b   (A0)+
  64. .copykeys    move.b  (A1)+,(A0)+
  65.         addq.l  #3,a0
  66.         dbf     d0,.copykeys
  67.  
  68.         ; opens keyboard device
  69.  
  70.         lea    _kbdevname(pc),A0
  71.         moveq.l    #0,D0
  72.         moveq.l    #0,D1
  73.  
  74.         lea    -64(A7),A7
  75.         move.l    A7,A1
  76.         move.l    $4.W,A6
  77.         JSRLIB    OpenDevice
  78.         move.l    20(A7),68(A5)    ; device base
  79.         lea    64(A7),A7
  80.  
  81.  
  82.         ; opens timer device
  83.  
  84.         lea    _timerdevname(pc),A0
  85.         moveq.l    #0,D0
  86.         moveq.l    #0,D1
  87.  
  88.         lea    -64(A7),A7
  89.         move.l    A7,A1
  90.         move.l    $4.W,A6
  91.         JSRLIB    OpenDevice
  92.         move.l    20(A7),64(A5)    ; device base
  93.         lea    64(A7),A7
  94.  
  95.         movem.l    (A7)+,D0-A6
  96.         rts
  97.  
  98. GETLANGSEL:
  99.     moveq.l    #2,D0    ; british english
  100.     rts
  101.  
  102. ; adds a vblank interrupt
  103. ; < A0: intRoutine
  104. ; < A1: intData
  105.  
  106. ADDVBLANKINT:
  107.     movem.l    D2-D7/A2-A6,-(A7)
  108.     lea    .int_entry(pc),A3
  109.     move.l    A0,(A3)
  110.     lea    .caller_int(pc),A0
  111.  
  112.     lea    .int_struct(pc),A3
  113.     move.b    #NT_INTERRUPT,8(A3)    ; ln_Type = INTERRUPT
  114.     move.b    #0,9(A3)        ; Highest priority
  115.     move.l    .vbname,10(A3)        ; The name of the server (for monitor programs)
  116.     move.l    A0,18(A3)        ; The new interrupt server code to chain with
  117.     move.l    A1,14(A3)        ; The data to pass in A1 at each call
  118.     move.l    #INTB_VERTB,D0        ; Vertical Blank interrupt
  119.     move.l    $4.W,A6
  120.     move.l    A3,A1            ; pointer on interrupt structure
  121.     JSR    _LVOAddIntServer(A6)    ; Adds the handler to the existing chain
  122.     
  123.     movem.l    (A7)+,D2-D7/A2-A6
  124.  
  125.     moveq.l    #1,D0            ; returns !=0 because success
  126.     rts
  127.  
  128. .caller_int:
  129.     move.l    .int_entry(pc),A5    ; as required in lowlevel autodoc
  130.     jmp    (A5)
  131.  
  132. .int_entry:
  133.     dc.l    0
  134. .int_struct:
  135.     ds.b    22
  136. .vbname:    
  137.     dc.b    "lowlevel vbl",0
  138.     cnop    0,4
  139.  
  140. ; adds a keyboard interrupt
  141. ; < A0: intRoutine
  142. ; < A1: intData
  143.  
  144. ADDKBINT:
  145.     movem.l    D2-D7/A2-A6,-(A7)
  146.     lea    .int_entry(pc),A3
  147.     move.l    A0,(A3)
  148.     lea    .caller_int(pc),A0
  149.  
  150.     lea    .int_struct(pc),A3
  151.     move.b    #NT_INTERRUPT,8(A3)    ; ln_Type = INTERRUPT
  152.     move.b    #0,9(A3)        ; Highest priority
  153.     move.l    .vbname(pc),10(A3)    ; The name of the server (for monitor programs)
  154.     move.l    A0,18(A3)        ; The new interrupt server code to chain with
  155.     move.l    A1,14(A3)        ; The data to pass in A1 at each call
  156.     move.l    #INTB_PORTS,D0        ; Ports interrupt
  157.     move.l    $4.W,A6
  158.     move.l    A3,A1            ; pointer on interrupt structure
  159.     JSR    _LVOAddIntServer(A6)    ; Adds the handler to the existing chain
  160.     
  161.     movem.l    (A7)+,D2-D7/A2-A6
  162.     moveq.l    #1,D0            ; returns !=0 because success
  163.     rts
  164.  
  165. .caller_int:
  166.  
  167. ;    move.b    $BFEC01,D0
  168. ;    not.b    D0
  169. ;    ror.b    #1,D0            ; raw keycode
  170.  
  171.     move.b    KBDQUALIFIER+1(pc),D0
  172.     cmp.b    .lastkey(pc),D0
  173.     beq.b    .ports_end        ; same key: impossible, since the key needs
  174.     lea    .lastkey(pc),a5
  175.     move.b    D0,(a5)            ; to be released. We don't call the user routine
  176.     move.l    .int_entry(pc),A5    ; as required in lowlevel autodoc
  177.  
  178.     ; acknowledge keyboard
  179.  
  180. ;    bsr    AckKeyboard
  181.  
  182. .out
  183.     ; jumps to user routine
  184.  
  185.     jmp    (A5)
  186. .ports_end
  187.     ; does not call user routine
  188.  
  189.     rts
  190.  
  191. .int_entry:
  192.     dc.l    0
  193. .int_struct:
  194.     ds.b    22
  195. .vbname:    
  196.     dc.b    "lowlevel kb",0
  197. .lastkey:
  198.     dc.b    0
  199.     cnop    0,4
  200.  
  201. ; adds a timer interrupt
  202. ; < A0: intRoutine
  203. ; < A1: intData
  204.  
  205. ADDTIMERINT:
  206.  
  207.     MOVEM.L    A0-A1/A4-A6,-(A7)    ;08C4: 48E700CE
  208.     MOVEA.L    A6,A5            ;08C8: 2A4E
  209.     MOVEA.L    $4.W,A6        ;08CA: 2C6E0034
  210.     JSR    _LVOForbid(A6)    ;(exec.library)
  211.     TST.L    242(A5)            ;08D2: 4AAD00F2
  212.     BEQ.S    LOWL_0061        ;08D6: 670C
  213.     JSR    _LVOPermit(A6)    ;(exec.library)
  214.     MOVEM.L    (A7)+,A0-A1/A4-A6    ;08DC: 4CDF7300
  215.     MOVEQ    #0,D0            ;08E0: 7000
  216.     RTS                ;08E2: 4E75
  217. LOWL_0061:
  218.     MOVEM.L    (A7)+,A0-A1        ;08E4: 4CDF0300
  219.     LEA    224(A5),A4        ;08E8: 49ED00E0
  220.     MOVE.L    A0,18(A4)        ;08EC: 29480012
  221.     MOVE.L    A1,14(A4)        ;08F0: 2949000E
  222.     CLR.B    9(A4)            ;08F4: 422C0009
  223.     MOVE.B    #$02,8(A4)        ;08F8: 197C00020008
  224.     MOVE.L    10(A5),10(A4)        ;08FE: 296D000A000A
  225.     JSR    _LVOPermit(A6)    ;(exec.library)
  226.     JSR    _LVODisable(A6)    ;(exec.library)
  227.     LEA    _ciaaname(pc),A1    ;090C: 43FA01F2
  228.     JSR    LOWL_0071        ;0910: 4EB900000A3C
  229.     BPL.S    LOWL_0062        ;0916: 6A1C
  230.     MOVEA.L    $4.W,A6        ;0918: 2C6D0034
  231.     LEA    _ciabname(pc),A1    ;091C: 43FA01F0
  232.     JSR    LOWL_0071        ;0920: 4EB900000A3C
  233.     BPL.S    LOWL_0062        ;0926: 6A0C
  234.     MOVEQ    #0,D0            ;0928: 7000
  235.     MOVE.L    D0,18(A4)        ;092A: 29400012
  236.     MOVEA.L    $4.W,A6        ;092E: 2C6D0034
  237.     BRA.S    LOWL_0065        ;0932: 603C
  238. LOWL_0062:
  239.     MOVE.L    A6,24(A4)        ;0934: 294E0018
  240.     MOVE    D0,22(A4)        ;0938: 39400016
  241.     BNE.S    LOWL_0063        ;093C: 6612
  242.     MOVEQ    #14,D1            ;093E: 720E
  243.     ROL.L    #8,D1            ;0940: E199
  244.     MOVE.L    #$000100CE,D0        ;0942: 203C000100CE
  245.     MOVEA.L    34(A6),A1        ; cia base from cia-resource
  246.     BRA.S    LOWL_0064        ;094E: 6010
  247. LOWL_0063:
  248.     MOVEQ    #15,D1            ;0950: 720F
  249.     ROL.L    #8,D1            ;0952: E199
  250.     MOVE.L    #$0002008E,D0        ;0954: 203C0002008E
  251.     move.l    34(A6),a1    ;cia-base from cia.resource
  252. LOWL_0064:
  253.     AND.B    D0,0(A1,D1)        ;0960: C1311000
  254.     SWAP    D0            ;0964: 4840
  255.     JSR    -24(A6)        ; SetICR
  256.     MOVEA.L    $4.W,A6        ;096A: 2C6D0034
  257.     MOVE.L    A4,D0            ;096E: 200C
  258. LOWL_0065:
  259.     JSR    _LVOEnable(A6)    ;(exec.library)
  260.     MOVEM.L    (A7)+,A4-A6        ;0974: 4CDF7000
  261.     RTS                ;0978: 4E75
  262.  
  263. LOWL_0071:
  264.     JSRLIB    OpenResource
  265.     MOVEA.L    D0,A6            ;0A40: 2C40
  266.     MOVEA.L    A4,A1            ;0A42: 224C
  267.     MOVE    #$0000,D0        ;0A44: 303C0000
  268.     MOVE    D0,-(A7)        ;0A48: 3F00
  269.     JSRLIB    AddICRVector ; (cia.resource)
  270.     TST.L    D0            ;0A4E: 4A80
  271.     BEQ.S    LOWL_0072        ;0A50: 6714
  272.     MOVEA.L    A4,A1            ;0A52: 224C
  273.     MOVE    #$0001,D0        ;0A54: 303C0001
  274.     MOVE    D0,(A7)            ;0A58: 3E80
  275.     JSRLIB    AddICRVector ; (cia.resource)
  276.     TST.L    D0            ;0A5E: 4A80
  277.     BEQ.S    LOWL_0072        ;0A60: 6704
  278.     MOVE    #$FFFF,(A7)        ;0A62: 3EBCFFFF
  279. LOWL_0072:
  280.     MOVE    (A7)+,D0        ;0A66: 301F
  281.     RTS                ;0A68: 4E75
  282.  
  283. REMTIMERINT:
  284.     MOVE.L    A6,-(A7)        ;0A18: 2F0E
  285.     MOVE.L    A1,-(A7)        ;0A1A: 2F09
  286.     BEQ.S    .rti_0070        ;0A1C: 6718
  287.     MOVE    22(A1),D0        ;0A1E: 30290016
  288.     MOVEA.L    24(A1),A6        ;0A22: 2C690018
  289.     JSR    _LVORemICRVector(A6); (cia.resource)
  290.     MOVEM.L    (A7)+,A1        ;0A2A: 4CDF0200
  291.     CLR.L    18(A1)            ;0A2E: 42A90012
  292.     MOVEA.L    (a7)+,a6        ;0A32: 2C5F
  293.     RTS                ;0A34: 4E75
  294. .rti_0070:
  295.     MOVEM.L    (A7)+,A1/A6        ;0A36: 4CDF4200
  296.     RTS                ;0A3A: 4E75
  297.  
  298. STARTTIMERINT:
  299.     MOVEM.L    D1-D3,-(A7)        ;09A4: 48E77000
  300.     TST.W    22(A1)            ;timer a or b?
  301.     BNE.S    .lab_006A        ;09AC: 6618
  302.     MOVEQ    #14,D2            ;09AE: 740E
  303.     ROL.L    #8,D2            ;09B0: E19A
  304.     MOVE.L    #$000100C6,D3        ;09B8: 263C000100C6
  305.     MOVEA.L    24(A1),a0
  306.     move.l    34(A0),a0    ;get cia-baseaddress from resource instead
  307.     MOVEA.L    #$00000400,A1        ;09B2: 227C00000400
  308.     BRA.S    .lab_006B        ;09C4: 6016
  309. .lab_006A:
  310.     MOVEQ    #15,D2            ;09C6: 740F
  311.     ROL.L    #8,D2            ;09C8: E19A
  312.     MOVE.L    #$00010086,D3        ;09D0: 263C00010086
  313.     MOVEA.L    24(A1),a0    ;#$00BFD000,A0        ;09D6: 207C00BFD000
  314.     move.l    34(A0),a0
  315.     MOVEA.L    #$00000600,A1        ;09CA: 227C00000600
  316. .lab_006B:
  317.     AND.B    D3,0(A0,D2)        ;09DC: C7302000
  318.     TST    D1            ;09E0: 4A41
  319.     BNE.S    .lab_006C        ;09E2: 6606
  320.     ORI.B    #$08,0(A0,D2)        ;09E4: 003000082000
  321. .lab_006C:
  322.     MOVE.L    44(A6),D1        ;09EA: 222E002C
  323.     LSR.L    #1,D0            ;09EE: E288
  324.     LSR.L    #4,D1            ;09F0: E889
  325.     MULU    D1,D0            ;09F2: C0C1
  326.     DIVU    #$7A12,D0        ;09F4: 80FC7A12
  327.     BNE.S    .lab_006D        ;09F8: 6602
  328.     ADDQ.B    #1,D0            ;09FA: 5200
  329. .lab_006D:
  330.     ADDA.L    A0,A1            ;09FC: D3C8
  331.     MOVE.B    D0,(A1)            ;09FE: 1280
  332.     LSR    #8,D0            ;0A00: E048
  333.     MOVE.B    D0,256(A1)        ;0A02: 13400100
  334.     TST    2(A7)            ;0A06: 4A6F0002
  335.     BEQ.S    .lab_006E        ;0A0A: 6706
  336.     SWAP    D3            ;0A0C: 4843
  337.     OR.B    D3,0(A0,D2)        ;0A0E: 87302000
  338. .lab_006E:
  339.     MOVEM.L    (A7)+,D1-D3        ;0A12: 4CDF000E
  340.     RTS                ;0A16: 4E75
  341.  
  342.  
  343. STOPTIMERINT:
  344.     TST.W    22(A1)            ;097A: 4A690016
  345.     BNE.S    .lab_0067        ;097E: 6610
  346.     MOVEQ    #14,D1            ;0980: 720E
  347.     ROL.L    #8,D1            ;0982: E199
  348.     MOVE    #$00CE,D0        ;0984: 303C00CE
  349.     move.l    24(A1),a1        ; cia base address
  350.     move.l    34(A1),a1
  351.     BRA.S    .lab_0068        ;098E: 600E
  352. .lab_0067:
  353.     MOVEQ    #15,D1            ;0990: 720F
  354.     ROL.L    #8,D1            ;0992: E199
  355.     MOVE    #$008E,D0        ;0994: 303C008E
  356.     move.l    24(A1),a1
  357.     move.l    34(A1),a1
  358. .lab_0068:
  359.     AND.B    D0,0(A1,D1)        ;099E: C1311000
  360.     RTS                ;09A2: 4E75
  361.  
  362.  
  363.  
  364. ; forces a port to a controller type and allows to reset it
  365.  
  366. SETJOYPORTATTRS:
  367.     moveq.l    #-1,D0    ; all went OK
  368.     rts
  369.  
  370. ; reads joypads/mouses/...
  371.  
  372. _ReadJoyPort:
  373.     movem.l    d1-d6/a4-a6,-(sp)
  374.  
  375.     lea    (_ciaa),a4
  376.     lea    (_custom),a5
  377.  
  378.     cmp.w    #0,D0
  379.     beq    .port0
  380.     cmp.w    #1,D0
  381.     beq    .port1
  382.     move.l    #JP_TYPE_NOTAVAIL,D0    ; neither port 0 or 1 !
  383.     bra    .rjexit
  384.  
  385. .port0
  386.     move.l    OSM_PORTS_CONFIG(pc),D0    ; type of controller connected (see osemu.asm)
  387.  
  388.     move.l    a6,-(sp)
  389.     lea    (joy0dat,a5),A6        ; joystick 1 moves
  390.     bsr    .joy_test
  391.     move.l    (sp)+,a6
  392.  
  393.     moveq    #CIAB_GAMEPORT0,d3    ; 1rst button (left mouse)
  394.     moveq    #10,d4            ; 2nd button (right mouse)
  395.     move.w    #$F600,d5
  396.     bra.b    .lbC0006F6
  397.  
  398. .port1
  399.     move.l    OSM_PORTS_CONFIG+4,D0    ; type of controller connected (see osemu.asm)
  400.  
  401.     move.l    a6,-(sp)
  402.     lea    (joy1dat,a5),A6        ; joystick 2 moves
  403.     bsr    .joy_test
  404.     move.l    (sp)+,a6
  405.  
  406.     moveq    #CIAB_GAMEPORT1,d3    ; 1rst button (red)
  407.     moveq    #14,d4            ; 2nd button (blue)
  408.     move.w    #$6F00,d5
  409.  
  410. .lbC0006F6
  411.     moveq    #0,d6
  412.     btst    d3,(a4)
  413.     bne.b    .lbC000706
  414.     bset    #JPB_BUTTON_RED,d0    ; fire/lmb
  415. .lbC000706
  416.     btst    d4,(potinp,a5)        ; a5=$DFF016
  417.     bne.b    .lbC000712
  418.     bset    #JPB_BUTTON_BLUE,d0    ; fire 2/rmb
  419. .lbC000712
  420.     bset    d3,(ciaddra,a4)
  421.     bclr    d3,(a4)
  422.     move.w    d5,(potgo,a5)        ; a5=$DFF034
  423.     moveq    #24-1,d1
  424.     bra.b    .lbC000746
  425.  
  426. .lbC000734
  427.     tst.b    (a4)
  428.     tst.b    (a4)
  429.     tst.b    (a4)
  430. .lbC000746
  431.     tst.b    (a4)
  432.     tst.b    (a4)
  433.     tst.b    (a4)
  434.     tst.b    (a4)
  435.     tst.b    (a4)
  436.     move.w    (potinp,a5),d2        ; a5=$DFF016
  437.     bset    d3,(a4)
  438.     bclr    d3,(a4)
  439.     btst    d4,d2
  440.     bne.b    .lbC00077C
  441.     bset    d1,d6
  442. .lbC00077C
  443.     dbra    d1,.lbC000734
  444.     bclr    d3,(ciaddra,a4)
  445.     move.w    #$FFFF,(potgo,a5)    ; a5=$DFF034
  446.  
  447.     and.l    #JP_BUTTON_MASK,d6
  448.     or.l    d6,d0
  449.  
  450.     move.l    D0,-(A7)
  451.     movem.l    D1/D2,-(A7)
  452.     move.l    .old_buttonmask(pc),D0
  453.     bsr    .button_test
  454.     movem.l    (A7)+,D1/D2
  455.     lea    .old_buttonmask(pc),a4
  456.     move.l    D0,(a4)
  457.     or.l    (A7),D0
  458.     move.l    D0,(A7)
  459.     move.l    (A7)+,D0
  460.  
  461. .rjexit
  462.     movem.l    (sp)+,d1-d6/a4-a6
  463.     rts
  464.  
  465.  
  466. ; other joypad buttons by keyboard emulation
  467. ; even a real joypad does not work properly on a real amiga!
  468. ; (I don't really know why!)
  469.  
  470. .button_test0
  471.     lea     JOYPAD0KEYS(pc),A0
  472.     moveq.l #6,D1
  473.  
  474.     movem.l D0,-(A7)
  475.     bsr     QueryKeys
  476.     movem.l (A7)+,D0
  477.  
  478.     lea     JOYPAD0KEYS(pc),A0
  479.     bra.s   .allbutton_test
  480.  
  481. .button_test:
  482.     lea    .query_array(pc),A0
  483.     moveq.l    #6,D1
  484.  
  485.     movem.l    D0,-(A7)
  486.     bsr    QueryKeys
  487.     movem.l    (A7)+,D0
  488.  
  489.     lea    .query_array(pc),A0
  490. .allbutton_test:
  491.     TEST_JOY_BUTTON    BLUE    ; F5: fire 2/blue/rmb
  492.     TEST_JOY_BUTTON    GREEN    ; F6: Green
  493.     TEST_JOY_BUTTON    YELLOW    ; F7: Yellow
  494.     TEST_JOY_BUTTON    PLAY    ; F8: Play/pause
  495.     TEST_JOY_BUTTON    REVERSE    ; F9: left ear
  496.     TEST_JOY_BUTTON    FORWARD    ; F10:right ear
  497.     rts
  498.  
  499. ; tests joystick moves
  500. ; < A6: custom reg. of the selected joystick
  501. ; > D0: joystick bits set
  502.  
  503. .joy_test:
  504.     movem.l    D4-D6,-(A7)
  505.  
  506.     move.w    (A6),D4
  507.     move.w    D4,D5
  508.     btst    #1,D4
  509.     beq.b    .left_off
  510.     bset    #JPB_JOY_RIGHT,D0
  511.     bra.b    .vert_test
  512. .left_off:
  513.     btst    #9,D4
  514.     beq.b    .vert_test
  515.     bset    #JPB_JOY_LEFT,D0
  516. .vert_test
  517.     lsr.w    #1,D4
  518.     eor.w    D5,D4
  519.     btst    #0,D4
  520.     beq.b    .back_off
  521.     bset    #JPB_JOY_DOWN,D0
  522.     bra.b    .exit
  523. .back_off
  524.     btst    #8,D4
  525.     beq.b    .exit
  526.     bset    #JPB_JOY_UP,D0
  527. .exit
  528.  
  529.     movem.l    (A7)+,D4-D6
  530.     rts
  531.  
  532. .old_buttonmask:
  533.     dc.l    0
  534. .old_buttonmask0:
  535.     dc.l    0
  536.  
  537. .query_array:
  538. JOYPAD1KEYS:
  539.     dc.w    $54,0
  540.     dc.w    $55,0
  541.     dc.w    $56,0
  542.     dc.w    $57,0
  543.     dc.w    $58,0
  544.     dc.w    $59,0
  545. JOYPAD0KEYS:
  546.     dc.w    $5,0
  547.     dc.w    $6,0
  548.     dc.w    $7,0
  549.     dc.w    $8,0
  550.     dc.w    $9,0
  551.     dc.w    $A,0
  552.  
  553. ; A0: queryArray
  554. ; D1: array size
  555.  
  556. QueryKeys:
  557.     MOVEM.L    D2/A2/A5-A6,-(A7)    ;1584: 48E72026
  558.     MOVEA.L    A6,A5            ;1588: 2A4E
  559.     MOVE.B    D1,D2            ;158A: 1401
  560.     MOVEA.L    A0,A2            ;158C: 2448
  561.     MOVEA.L    $4.W,A6
  562.     SUBA.L    A1,A1            ;1592: 93C9
  563.     JSRLIB    FindTask    ;(exec.library)
  564.  
  565. ;;;    MOVEA.L    84(A5),A0        ;1598: keyboard.device base
  566. ;;;    MOVE.L    D0,16(A0)        ;159C: 21400010
  567. ;;;    MOVE.B    #$04,15(A0)        ;15A0: 117C0004000F
  568. ;;;    MOVE.B    #$00,14(A0)        ;15A6: 117C0000000E
  569.  
  570.     LEA    -64(A7),A7        ;15AC: 4FEFFFC0
  571.  
  572. ;;;    MOVE.L    A0,14(A7)        ;15B0: 2F48000E
  573.  
  574.     MOVEA.L    A7,A1            ;15B4: 224F
  575.     MOVE.L    68(A5),20(A1)        ;15B6: 236D00440014
  576.     MOVE    #$000A,28(A1)        ;15BC: 337C000A001C
  577.     LEA    48(A7),A0        ;15C2: 41EF0030
  578.     MOVE.L    A0,40(A1)        ;15C6: 23480028
  579.     MOVE.L    #$00000010,36(A1)    ;15CA: 237C000000100024
  580.     JSR    _LVODoIO(A6)    ;(exec.library)
  581.     TST.B    D0            ;15D6: 4A00
  582.     BNE.S    .qk_00E2        ;15D8: 661E
  583. .qk_00DE:
  584.     MOVE    (A2)+,D1        ;15DA: 321A
  585.     MOVE    D1,D0            ;15DC: 3001
  586.     AND    #$0007,D0        ;15DE: C07C0007
  587.     LSR    #3,D1            ;15E2: E649
  588.     BTST    D0,48(A7,D1)        ;15E4: 01371030
  589.     BEQ.S    .qk_00DF        ;15E8: 6706
  590.     MOVE    #$FFFF,(A2)+        ;15EA: 34FCFFFF
  591.     BRA.S    .qk_00E0        ;15EE: 6004
  592. .qk_00DF:
  593.     MOVE    #$0000,(A2)+        ;15F0: 34FC0000
  594. .qk_00E0:
  595.     SUBQ.B    #1,D2            ;15F4: 5302
  596. .qk_00E1:
  597.     BNE.S    .qk_00DE        ;15F6: 66E2
  598. .qk_00E2:
  599. ;;;    MOVEA.L    14(A7),A0        ;15F8: 206F000E
  600.     LEA    64(A7),A7        ;15FC: 4FEF0040
  601. ;;;    MOVE.B    #$02,14(A0)        ;1600: 117C0002000E
  602.     MOVEM.L    (A7)+,D2/A2/A5-A6    ;1606: 4CDF6404
  603.     RTS                ;160A: 4E75
  604.  
  605. ; gets rawkey+qualifier
  606. GETKEY:
  607.     move.w    KBDQUALIFIER(pc),D0
  608.     tst.b    D0
  609.     beq.b    .nok
  610.     rts
  611. .nok
  612.     st.b    D0
  613.     rts
  614.  
  615. ELAPSEDTIME:
  616.     MOVEM.L    D2-D3/A6,-(A7)        ;0A6A: 48E73002
  617.     MOVE.L    4(A0),-(A7)        ; old values
  618.     MOVE.L    (A0),-(A7)
  619.     MOVEA.L    64(A6),A6    ; timer base
  620.     JSRLIB    ReadEClock
  621.     MOVEM.L    (A0)+,D1-D2        ;0A7C: 4CD80006
  622.     SUB.L    4(A7),D2        ;0A80: 94AF0004
  623.     MOVE.L    (A7)+,D3        ;0A84: 261F
  624.     ADDQ    #4,A7            ;0A86: 584F
  625.     SUBX.L    D3,D1            ;0A88: 9383
  626.     BPL.S    LAB_0074        ;0A8A: 6A04
  627.     NEG.L    D2            ;0A8C: 4482
  628.     NEGX.L    D1            ;0A8E: 4081
  629. LAB_0074:
  630.     SWAP    D1            ;0A90: 4841
  631.     TST    D1            ;0A92: 4A41
  632.     BNE.S    LAB_0076        ;0A94: 6614
  633.     SWAP    D2            ;0A96: 4842
  634.     MOVE    D2,D1            ;0A98: 3202
  635.     CLR    D2            ;0A9A: 4242
  636.     IFND    HARRY
  637.     MC68020        ; lowlevel should need 68020+AGA so noproblemo with this
  638.     ENDC
  639.     DIVU.L    D0,D1:D2        ;0A9C: 4C402401
  640.     IFND    HARRY
  641.     MC68000
  642.     ENDC
  643.     BVS.S    LAB_0076        ;0AA0: 6908
  644.     MOVE.L    D2,D0            ;0AA2: 2002
  645. LAB_0075:
  646.     MOVEM.L    (A7)+,D2-D3/A6        ;0AA4: 4CDF400C
  647.     RTS                ;0AA8: 4E75
  648. LAB_0076:
  649.     MOVEQ    #-1,D0            ;0AAA: 70FF
  650.     BRA.S    LAB_0075        ;0AAC: 60F6
  651.  
  652.